home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / _archvrs / unix / unzip51 / winsetup.c < prev    next >
C/C++ Source or Header  |  1992-11-04  |  5KB  |  149 lines

  1. /* winsetup.c
  2.  *
  3.  * This file is #included into unzip.c.  It contains much of the same
  4.  * code as unzip's main().  15 Oct 92
  5.  */
  6.  
  7.  
  8. /* MS Windows Setup  and Take-Down functions bracket calls to 
  9.  * process_zipfile().
  10.  * These functions allocate and free the necessary buffers, set and clear
  11.  * any global variables so that  process_zipfile()  can be called multiple
  12.  * times in the same session of WizUnzip. You'll recognize some of the 
  13.  * code from main() in SetUpToProcessZipFile().
  14.  */
  15. HANDLE hOutBuf;
  16. HANDLE hOutOut;   /* added 04/03/92 for version 1.1 */
  17. HANDLE hInBuf;
  18. HANDLE hZipFN;
  19. HANDLE hFileName;
  20.  
  21. BOOL FSetUpToProcessZipFile(int ncflag, int ntflag, int nvflag, int nUflag, 
  22.        int nzflag, int ndflag, int noflag, int naflag, int argc,
  23.        LPSTR lpszZipFN, PSTR *PFNAMES)
  24. {
  25.     /* clear all global flags -- need to or not. */
  26.  
  27.     tflag = vflag=cflag=aflag=U_flag=quietflg=zflag = 0;
  28.     overwrite_all=overwrite_none=0;
  29.     pfnames = &fnames[0];   /* assign default filename vector... */
  30.     pxnames = &fnames[1];   /* ...and default excluded-filename vector */
  31.  
  32.     cflag = ncflag; overwrite_all = noflag;
  33.     tflag = ntflag; vflag = nvflag; zflag = nzflag; U_flag = nUflag;
  34.     aflag = naflag;
  35.     sflag = 1;
  36.  
  37.     local_hdr_sig[0] = central_hdr_sig[0] = end_central_sig[0] = '\120';
  38.     local_hdr_sig[1] = central_hdr_sig[1] = end_central_sig[1] = '\0';
  39.  
  40.     if (!(hZipFN = LocalAlloc(LMEM_MOVEABLE, FILNAMSIZ)))
  41.         return FALSE;
  42.  
  43.     zipfn = (char *)LocalLock(hZipFN);
  44.     lstrcpy(zipfn, lpszZipFN);
  45.     if (stat(zipfn, &statbuf) || (statbuf.st_mode & S_IFMT) == S_IFDIR)
  46.         strcat(zipfn, ZSUFX);
  47.  
  48.     if (stat(zipfn, &statbuf)) {  /* try again */
  49.         fprintf(stderr, "error:  can't find zipfile [ %s ]\n", zipfn);
  50.         return TRUE;              /* 9:  file not found */
  51.     } else
  52.         ziplen = statbuf.st_size;
  53.  
  54.     if (argc != 0) {
  55.         char **pp = PFNAMES-1;
  56.         char *q;
  57.  
  58.         pfnames = PFNAMES;
  59.         /* convert MSDOS-style directory separators to Unix-style ones */
  60.         while (*pfnames != NULL) {
  61.             for (q = *pfnames;  *q;  ++q)
  62.                 if (*q == '\\')
  63.                     *q = '/';
  64.             ++pfnames;
  65.         }
  66.         pfnames = PFNAMES;
  67.         while (*++pp)
  68.             if (!strcmp(*pp, "-x")) {
  69.                 if (pp > PFNAMES)
  70.                     **pp = 0;          /* terminate pfnames */
  71.                 else
  72.                     pfnames = fnames;  /* defaults */
  73.                 pxnames = pp + 1;      /* excluded-names ptr starts after -x */
  74.                 break;                 /* skip rest of args */
  75.             }
  76.         process_all_files = FALSE;
  77.     } else
  78.         process_all_files = TRUE;       /* for speed */
  79.  
  80. /*---------------------------------------------------------------------------
  81.     Okey dokey, we have everything we need to get started.  Let's roll.
  82.   ---------------------------------------------------------------------------*/
  83.  
  84.     if (hInBuf = LocalAlloc(LMEM_MOVEABLE, INBUFSIZ+4)) {  /* 4 extra: hold[] */
  85.         inbuf = (uch *)LocalLock(hInBuf);
  86.         WinAssert(inbuf);
  87.     }
  88.     if (hOutBuf = LocalAlloc(LMEM_MOVEABLE, OUTBUFSIZ+1)) {  /* extra: ASCIIZ */
  89.         outbuf = (uch *)LocalLock(hOutBuf);
  90.         WinAssert(outbuf);
  91.         if (aflag) {   /* if LF => CR,LF translation */
  92.             if (hOutOut = GlobalAlloc(GMEM_MOVEABLE,OUTBUFSIZ)) {
  93.                 outout = (uch _far *)GlobalLock(hOutOut);
  94.                 WinAssert(outout);
  95.             }
  96.         } else    /* no translation; just re-use output buffer */
  97.             outout = (uch _far *)outbuf;  /*  point to outbuf */
  98.     }
  99.     if ( hFileName = LocalAlloc(LMEM_MOVEABLE, FILNAMSIZ)) {
  100.         filename = (char *)LocalLock(hFileName);
  101.         WinAssert(filename);
  102.     }
  103.  
  104.     if ((inbuf == NULL) || (outbuf == NULL) || (outout == NULL) ||
  105.         (zipfn == NULL) || (filename == NULL))
  106.         return FALSE;
  107.  
  108.     hold = &inbuf[INBUFSIZ];   /* to check for boundary-spanning signatures */
  109.  
  110.     return TRUE;    /* set up was OK */
  111. }
  112.  
  113. void TakeDownFromProcessZipFile(void)
  114. {
  115.     if (inbuf) {
  116.         LocalUnlock(hInBuf);
  117.         inbuf = NULL;
  118.     }
  119.     if (hInBuf)
  120.         hInBuf = LocalFree(hInBuf);
  121.  
  122.     if (outbuf) {
  123.         LocalUnlock(hOutBuf);
  124.         outbuf = NULL;
  125.     }
  126.     if (hOutBuf)
  127.         hOutBuf = LocalFree(hOutBuf);
  128.  
  129.     if (aflag && outout)    /* if doing LF => CR,LF translation */
  130.         GlobalUnlock(hOutOut);
  131.     outout = NULL;          /* free now, translation or not     */
  132.     if (hOutOut)
  133.         hOutOut = GlobalFree(hOutOut);  /* mark buffer as freed */
  134.  
  135.     if (zipfn) {
  136.         LocalUnlock(hZipFN);
  137.         zipfn = NULL;
  138.     }
  139.     if (hZipFN)
  140.         hZipFN = LocalFree(hZipFN);
  141.  
  142.     if (filename) {
  143.         LocalUnlock(hFileName);
  144.         filename = NULL;
  145.     }
  146.     if (hFileName)
  147.         hFileName = LocalFree(hFileName);
  148. }
  149.